#include <iostream>
using namespace std;
#include "Rectangulo.h"
#include "Figura2D.h"
#include <sstream>


Rectangulo::Rectangulo(Coordenada c,float nx,float ny, int grosor, Color fondo, Color linea)
{
	if (nx<0)
	{
		throw ExcepcionValorNoValido(nx,"debe ser positivo o cero");
	}
	else base=nx; 
	if (ny<0)
	{
		throw ExcepcionValorNoValido(nx,"debe ser positivo o cero");
	}
	else altura=ny;
	
	this->mover(c);
	this->setGrosorLinea(grosor);
	
	if(fondo<17){ this->setFondo(fondo);}
	else {throw ExcepcionValorNoValido(fondo,"esta fuera del rango de color");}

	if(linea<17){ this->setLinea(linea);}
	else {throw ExcepcionValorNoValido(linea,"esta fuera del rango de color");}
}
		
Rectangulo::Rectangulo(const Rectangulo& r):Figura2D(r)
{
	base=r.base;
	altura=r.altura;
}

Rectangulo::~Rectangulo()
{
	base=0.0;
	altura=0.0;
}

Rectangulo& 
Rectangulo::operator=(const Rectangulo& r)
{
	if (this!=&r)
	{
		Figura2D::operator=(r);
		base=r.base;
		altura=r.altura;
	}
	
	return *this;
}

void 
Rectangulo::leeEntrada(istream& is)
{
	//la figura ha sido creada en leer entrada de IDibujable
	Figura2D::leeEntrada(is);
	float a,b;
	is>>b;
	is>>a;
	
	if(b>0) {setBase(b);}
	else throw ExcepcionValorNoValido(b,"debe ser positivo");
	
	if(a>0) {setAltura(a);}
	else throw ExcepcionValorNoValido(a,"debe ser positivo");
}

Rectangulo*
Rectangulo::clonar() const
{
	return new Rectangulo(*this);
}

void
Rectangulo::escalar( float escala)
{
	 try
   {
      if(escala>0)
      {
         base=(base*escala)/100.0;
         altura=(altura*escala)/100.0;
      }
      else
      {
         throw(ExcepcionValorNoValido(escala, "escala no valida"));
      }
   }
   catch(ExcepcionValorNoValido& ex)
   {
    	cerr<<ex.what();
   }	
}



void 
Rectangulo::pintar(ostream& os) const
{
   os << "        <rect "<< "x=\"" << getOrigen().getX() << "\" y=\"" << getOrigen().getY();
   os<< "\" width=\"" << getBase() << "\" height=\""<< getAltura() <<  "\" ";
	Figura2D::pintar(os);
	os<<" />";
}

Rectangulo*
Rectangulo::duplicar(const Coordenada& nc)
{
	Rectangulo* p=this->clonar();
	p->agrupada=false;
	p->mover(nc);
	
	return p;
}

ostream& 
operator<<(ostream& os,const Rectangulo& r)
{
	r.pintar(os);
	return os;	
}


